「這幾天寫陣列的題目,還算是有趣吧?」
「對呀!從陣列內學到了很多有趣的作法」看得出曉欣在家裡練習時,又重複看了很多次《Kotlin Collection全方位解析攻略 : 精通原理及實戰,寫出流暢好維護的程式》這本書。
「今天我們來嘗試這一題看看」夏天邊說,邊打開了 9. Palindrome Number 這題
「嗯⋯⋯如果用數學的方式去算,也不是算不出來,可是感覺好麻煩。」
「那我們來嘗試一個新的資料結構:字串。簡單的說,你可以將字串當作是處理一段文字。在 Kotlin 裡面,如果是一段文字的話,那將這段文字反轉過來,可以直接使用 reversed()」
「那這樣的話,不就很簡單嗎?」菁菁邊說邊寫出答案
class Solution {
    fun isPalindrome(x: Int): Boolean {
        return x.toString().reversed() == x.toString()
    }
}
「菁菁不對啦!還有負數的狀況呀」「對耶!原來如此」
class Solution {
    fun isPalindrome(x: Int): Boolean {
        if (x < 0) {
            return false
        }
        return x.toString().reversed() == x.toString()
    }
}
「沒錯!兩位配合的越來越好了!」
「謝謝老師⋯⋯不是,謝謝夏姐誇獎。」
「當然了,還可以這樣寫」
class Solution {  
    fun isPalindrome(x: Int) = when {  
        x < 0 -> false  
        else -> x.toString().reversed() == x.toString()  
    }  
}
「既然前面這題這麼快就寫出來了,那麼這一題應該也不是什麼難事」夏天打開 7. Reverse Integer
兩位討論了一陣,很快地寫出了解答
class Solution {
    fun reverse(x: Int): Int {
        val ret = if (x < 0) {
            (x * -1L).toString().reversed().toLong() * -1
        } else {
            x.toString().reversed().toLong()
        }
        return ret.toInt()
    }
}
送出答案之後,曉欣很疑惑是哪邊錯了。菁菁倒是很快地察覺到了問題。
「啊!題目有特別提到:If reversing x causes the value to go outside the signed 32-bit integer range [-2^31, 2^31 - 1], then return 0」
「這個是什麼意思呀?」曉欣不解地問。
「有時候一個數字原本很小,翻轉過之後可能會變大很多。像是 1119 翻轉之後變成 9111 這樣。如果一個數字翻轉後超過 2^31 ,那我們就要回傳 0」菁菁開始修改答案
class Solution {
    fun reverse(x: Int): Int {
        val ret = if (x < 0) {
            (x * -1L).toString().reversed().toLong() * -1
        } else {
            x.toString().reversed().toLong()
        }
        return if (ret > 0x7fffffff || ret < -0x7fffffff) 0 else ret.toInt()
    }
}
「原來如此!寫程式要注意的細節好多!」
「對呀!字串是不是挺有趣的?」夏天笑著說
「感覺跟 Collection 有點像!一樣可以做 reversed() 之類的操作」
「不只是可以做 reversed() 喔!」夏天開啟了新題目: 1108. Defanging an IP Address
「這題的話,可以用 replace() 這個函數很快的做出來」
class Solution {
    fun defangIPaddr(address: String) =
        address.replace(".","[.]")
}
「今天新學字串這個資料格式,先讓兩位消化一下,之後還有很多好玩的題目!」